package cn.tedu.tmall.front.mall.service.impl;

import cn.tedu.tmall.common.exception.ServiceException;
import cn.tedu.tmall.common.pojo.po.CurrentUser;
import cn.tedu.tmall.common.web.ServiceCode;
import cn.tedu.tmall.front.mall.dao.repository.ICartCacheRepository;
import cn.tedu.tmall.front.mall.pojo.po.CartPO;
import cn.tedu.tmall.front.mall.pojo.vo.CartVO;
import cn.tedu.tmall.front.mall.service.ICartService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Slf4j
@Service
public class CartService implements ICartService {

    private static final Integer CHECKED = 1;

    private static final Integer UNCHECKED = 0;

    @Autowired
    private ICartCacheRepository cartCacheRepository;
    /**
     * 添加购物车
     */
    @Override
    public void addCart(CurrentUser user, Long goodsId, Integer goodsNum) {
        /*
         * todo 业务梳理：
         *  1.商品是否存在 2.商品是否上架 3.添加购物车
         * 特点：高读高写，可以接受数据丢失（考虑使用redis）
         * 数据库和redis都有持久化的概念，
         * 但redis不支持事务的ACID，所以redis不能保证数据的一致性
         */
        CartPO getGoods = cartCacheRepository.getGoodsByUserAndGoodsId(user.getId(),goodsId);
        if (getGoods != null){
            //商品已存在，执行修改数量操作
            cartCacheRepository.increase(user.getId(),goodsId,goodsNum);
            return;
        }
        //商品不存在，添加购物车
        CartPO cartPO = new CartPO();
        cartPO.setGoodsId(goodsId);
        cartPO.setGoodsName("iPhone15");
        //todo 了解Decimal类型
        cartPO.setGoodsPrice(8888L);
        cartPO.setGoodsNum(goodsNum);
        cartPO.setChecked(1);
        cartPO.setCartTime(System.currentTimeMillis());
        cartCacheRepository.addCart(user.getId(),cartPO);
    }

    @Override
    public void modify(CurrentUser user, Long goodsId, Integer goodsNum) {
        //todo 业务梳理：1.商品是否存在 2.商品是否上架
        //商品已存在：修改数量；商品不存在：添加购物车
        CartPO cartPO = cartCacheRepository.getGoodsByUserAndGoodsId(user.getId(),goodsId);
        if (cartPO != null){
            //商品已存在，覆盖数量
            cartCacheRepository.modify(user.getId(),goodsId, goodsNum);
        } else {
            //商品不存在，添加购物车
            addCart(user,goodsId, goodsNum);
        }
    }

    @Override
    public void increase(CurrentUser user, Long goodsId, Integer goodsNum) {
        //todo 业务梳理：1.商品是否存在 2.商品是否上架
        //商品已存在：修改数量；商品不存在：添加购物车
        CartPO cartPO = cartCacheRepository.getGoodsByUserAndGoodsId(user.getId(),goodsId);
        if (cartPO != null){
            //商品已存在，加减数量
            cartCacheRepository.increase(user.getId(),goodsId, goodsNum);
        } else {
            //商品不存在，添加购物车
            addCart(user,goodsId, goodsNum);
        }
    }

    @Override
    public List<CartVO> getCartList(CurrentUser user) {
        log.debug("Service-获取购物车列表-入参:{}",user);
        List<CartPO> cartPOS = cartCacheRepository.getCartList(user.getId());
        log.debug("Service-获取购物车列表-获取到的cartPOS:{}",cartPOS);
        //对cartPOS进行排序
        cartPOS.sort((o1, o2) -> {
            if (o2 != null && o2.getCartTime() != null)
                return o2.getCartTime().compareTo(o1.getCartTime());
            return 0;
        });
        log.debug("Service-获取购物车列表-排序后的cartPOS:{}",cartPOS);
        //遍历cartPOS，将cartPOS转换为cartVOS
        List<CartVO> cartVOS = new ArrayList<>();
        cartPOS.forEach(cartPO -> {
            CartVO cartVO = new CartVO();
            BeanUtils.copyProperties(cartPO,cartVO);
            cartVOS.add(cartVO);
        });
        log.debug("Service-获取购物车列表-转换为cartVOS:{}",cartVOS);
        return cartVOS;
    }

    @Override
    public void delete(CurrentUser user, Long goodsId) {
        cartCacheRepository.delete(user.getId(),goodsId);
    }

    @Override
    public void checked(CurrentUser user, Long goodsId, Integer checked) {
        log.debug("Service-选中/取消选中商品-入参:{},{},{}",user,goodsId,checked);
        if (CHECKED.equals(checked) && UNCHECKED.equals(checked)){
            throw new ServiceException(ServiceCode.FAIL.getCode(), "非法的checked值");
        }
        cartCacheRepository.checked(user.getId(), goodsId, checked);
    }
}
